﻿/*   
    Copyright (C) 2009 Galaktika Corporation ZAO

    This file is a part of Galaktika.BusinessMonitor
 
    Galaktika.BusinessMonitor is a free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
      
    You should have received a copy of the GNU General Public License
    along with Galaktika.BusinessMonitor.  If not, see <http://www.gnu.org/licenses/>.
  
    If GPL v.3 is not suitable for your products or company,
    Galaktika Corp provides Galaktika.BusinessMonitor under a flexible commercial license
    designed to meet your specific usage and distribution requirements.
    If you have already obtained a commercial license from Galaktika Corp,
    you can use this file under those license terms.
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Ranet.Olap.Core;
using Ranet.Olap.Core.Data;
using Ranet.Olap.Core.Providers;

namespace Galaktika.BI.Silverlight.ClientApp.Web
{
    /// <summary>
    /// Веб-сервис для сводной таблицы, содержит экспорт в excel.
    /// </summary>
    [WebService(Namespace = Common.Namespace)]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class PivotGridService : WebService
    {
//        string connectionStringL = "Provider=msolap.4;Data Source=Dpp-601\\SQL2008;Initial Catalog = Galaktika BI AS;";//context.Request.Params["connectionString"];
//        string queryL =
//            @"WITH
//        MEMBER [Сценарий].[Сценарий].[План-Факт] AS 'iif(0=1
//        ,iif(IsNull([Сценарий].[Сценарий].[план ручной]), NULL, [Сценарий].[Сценарий].[план ручной] - [Сценарий].[Сценарий].[Факт])
//        ,[Сценарий].[Сценарий].[План - Факт])',BACK_COLOR='iif(IsNull(iif(0=1,[Сценарий].[Сценарий].[план ручной],[Сценарий].[Сценарий].[План])) or (iif(0=1,[Сценарий].[Сценарий].[план ручной],[Сценарий].[Сценарий].[План]) = 0)
//         , RGB(255, 255, 255), // белый
//         iif([Сценарий].[Сценарий].[% выполнения плана] < 0.75,
//          RGB(255, 128, 128), // красный
//          iif([Сценарий].[Сценарий].[% выполнения плана] < 0.95,
//           RGB(255, 255, 153), // желтый,
//           RGB(204, 255, 204)  // зеленый
//          )
//         )
//        )'
//        MEMBER [Сценарий].[Сценарий].[Факт-План] AS 'iif(0=1
//        ,iif(IsNull([Сценарий].[Сценарий].[план ручной]), NULL, [Сценарий].[Сценарий].[Факт] - [Сценарий].[Сценарий].[план ручной])
//        ,[Сценарий].[Сценарий].[Факт - План])'
//        MEMBER [Показатель].[Показатель].[Фильтр] AS '[Показатель].[Показатель].[выбранный]'
//        MEMBER [Валюта представления].[Валюта].[Фильтр] AS '(
//         [Валюта представления].[Валюта].&[0]
//        ,[Единица измерения].[Единица измерения].[Все единицы измерения]
//        ,[Направление].[Направление].[Все направления]
//        ,[Показатель].[Показатель].[Фильтр]
//        ,[Сценарий].[Сценарий].[Факт]
//        ,[Вид деятельности].[Вид деятельности].[Продажи]
//        ,[Потоки].[Потоки].[товарные]
//        --,[Период].[ГКМД].[Квартал].&[2005]&[3]
//        )',SOLVE_ORDER=5
//        MEMBER [Measures].[Лидеры] AS 'Aggregate(([Валюта представления].[Валюта].[Фильтр],[Период].[ГКМД].[Квартал].&[2005]&[3],[Номенклатура].[Тип-Группа-Номенклатура].[Вся номенклатура],[Договор].[Договор].[Все договоры],[Центр ответственности].[Центр ответственности].[Все центры ответственности],[Учет отклонений].[Учет отклонений].&[без учета отклонений],[Организационная единица].[Организационная единица].[Все организационные единицы],[Категория контрагента].[Категория контрагента].[Все категории контрагентов],[Канал сбыта].[Канал сбыта].[Все каналы сбыта],[Бренд].[Бренд].[Все товары]),[Measures].[Сумма])'
//        SET [PickPeriodXYZ] AS 'Descendants([Период].[ГКМД].[Квартал].&[2005]&[3],[Период].[ГКМД].[Месяц])'
//        SET [PickData_X] AS 'order(Filter(Descendants([Контрагент].[Страна-Город-Контрагент].[Все контрагенты],1,LEAVES)
//        ,not (Iif((1=3) or (1=2),Round([Measures].[Лидеры],2)<0
//        ,Round([Measures].[Лидеры],2)=0))),[Measures].[Лидеры],BDesc)'
//        SET [PickData_ABC_A] AS 'TopPercent([PickData_X],80,[Measures].[Лидеры])'
//        SET [PickData_ABC_AB] AS 'TopPercent([PickData_X],80+15,[Measures].[Лидеры])'
//        MEMBER [Measures].[Коэф.вариации] AS 'StdevP([PickPeriodXYZ],CoalesceEmpty([Measures].[Сумма],0))/Sum([PickPeriodXYZ],CoalesceEmpty([Measures].[Сумма],0))/Count([PickPeriodXYZ])*100'
//        SET [PickData_XResultABC] AS '[PickData_X]'
//        SET [PickData_XResult] AS 'order(Filter([PickData_XResultABC],1),[Measures].[Лидеры],BDesc)'
//        SET [PickData_XTop] AS 'Iif(5 = 0,[PickData_XResult],
//        Iif(0=0,Head([PickData_XResult],5),Tail([PickData_XResult],5)))'
//        SET [PickData_XOther] AS 'Iif(0=0,{},Except([PickData_XResult],[PickData_XTop]))'
//        MEMBER [Контрагент].[Страна-Город-Контрагент].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Контрагент].[Страна-Город-Контрагент]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Номенклатура].[Тип-Группа-Номенклатура].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Номенклатура].[Тип-Группа-Номенклатура]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Договор].[Договор].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Договор].[Договор]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Центр ответственности].[Центр ответственности].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Центр ответственности].[Центр ответственности]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Организационная единица].[Организационная единица].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Организационная единица].[Организационная единица]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Категория контрагента].[Категория контрагента].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Категория контрагента].[Категория контрагента]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Канал сбыта].[Канал сбыта].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Канал сбыта].[Канал сбыта]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Бренд].[Бренд].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Бренд].[Бренд]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Период].[ГКМД].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Период].[ГКМД]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Учет отклонений].[Учет отклонений].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Учет отклонений].[Учет отклонений]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        MEMBER [Сценарий].[Сценарий].[(ТОП-Прочие)] AS 'Iif(""[Контрагент].[Страна-Город-Контрагент]""=""[Сценарий].[Сценарий]"", Aggregate([PickData_XOther]), NULL)',FORMAT_STRING='#,0.00'
//        SET [TOP_Other] AS 'Iif(Count([PickData_XResult])<=Count([PickData_XTop]),{},{})'
//        MEMBER [Measures].[ViewOrder] AS '[Контрагент].CurrentMember.Properties(""Name"")'
//        SET [PickDataVisible] AS 'Union(order([PickData_XTop],([Measures].[Лидеры]),BDesc),[TOP_Other])'
//        SET [PickMeasures_0] AS 'Iif(0=0,{[Measures].[Сумма],[Measures].[Количество]},Except({[Measures].[Сумма],[Measures].[Количество]},{[Measures].[Маржа]}))'
//        SET [PickMeasures_1] AS 'Union({[Measures].[Сумма]},Except([PickMeasures_0],{[Measures].[Сумма]}))'
//        SELECT
//        {[PickMeasures_1]} ON 0,
//        NON EMPTY {[PickDataVisible]} ON 1
//        FROM [Товарные и финансовые потоки]
//        WHERE 
//        ([Показатель].[Показатель].[Фильтр],StrToMember('[Единица измерения].[Единица измерения].[Все единицы измерения]'),StrToMember('[Направление].[Направление].[Все направления]'),StrToMember('[Валюта представления].[Валюта].&[0]'),StrToMember('[Вид деятельности].[Вид деятельности].[Продажи]'),StrToMember('[Потоки].[Потоки].[товарные]'),StrToMember('[Сценарий].[Сценарий].[Факт]'),StrToTuple('([Период].[ГКМД].[Квартал].&[2005]&[3],[Номенклатура].[Тип-Группа-Номенклатура].[Вся номенклатура],[Договор].[Договор].[Все договоры],[Центр ответственности].[Центр ответственности].[Все центры ответственности],[Учет отклонений].[Учет отклонений].&[без учета отклонений],[Организационная единица].[Организационная единица].[Все организационные единицы],[Категория контрагента].[Категория контрагента].[Все категории контрагентов],[Канал сбыта].[Канал сбыта].[Все каналы сбыта],[Бренд].[Бренд].[Все товары])'))
//        CELL PROPERTIES BACK_COLOR,CELL_ORDINAL,FORE_COLOR,FONT_NAME,FONT_SIZE,FONT_FLAGS,FORMAT_STRING,VALUE,FORMATTED_VALUE";
            
        
       // /// <summary>
       // /// Экспорт в Excel.
       // /// </summary>
       //[WebMethod]
       // public void ExportToExcel(string str)
       // {
       //     CellSetData res = Runtime.DataAccess.AdomdQueryExecutor.StaticExecuteQuery(connectionStringL, queryL);
       //     PivotDataProvider pivotProvider = new PivotDataProvider(new CellSetDataProvider(res));
       //     string xmlExcel = ExportHelper.ExportToExcel(pivotProvider);
            
       //     this.Context.Response.ClearContent();
       //     this.Context.Response.Buffer = true;
       //     this.Context.Response.ContentType = "application/vnd.ms-excel";
       //     this.Context.Response.Write(xmlExcel);
       // }

       /// <summary>
       /// Экспорт в Excel.
       /// </summary>
       [WebMethod (EnableSession = true)]
       public void SetExportParameters(string token, string connectionString, string query)
       {
           Parameters parameters = new Parameters(connectionString, query);
           this.Context.Session.Add(token, parameters);
       }

    }

    public class Parameters
    {
        public Parameters(string connectionString, string query)
        {
            this.m_ConnectionString = connectionString;
            this.m_Query = query;
        }

        private string m_ConnectionString;
        private string m_Query;
        public string ConnectionString
        {
            get
            {
                return m_ConnectionString;
            }
            set
            {
                m_ConnectionString = value;
            }
        }
        public string Query
        {
            get
            {
                return m_Query;
            }
            set
            {
                m_Query = value;
            }
        }
    }
}
